# 需求：基于‘注册实例.html’页面（本地文件），完成多窗口句柄操作与元素交互
# 1. 获取初始页面（表单综合实例）的当前窗口句柄
# 2. 点击页面中“注册A页面”链接（打开新窗口）
# 3. 获取所有已打开的窗口句柄
# 4. 筛选出注册A页面的窗口句柄，并切换到该窗口
# 5. 操作注册A页面的表单元素（填写注册信息）

# 从time模块导入sleep函数，用于操作间隔暂停（等待页面加载、窗口打开）
from time import sleep
# 从selenium库导入webdriver模块，用于创建浏览器驱动、控制浏览器
from selenium import webdriver
# 导入ActionChains类（此处未实际使用，保留原导入，可后续扩展）
from selenium.webdriver import ActionChains
# 导入By类：适配新版selenium，替代已弃用的find_element_by_*方法
from selenium.webdriver.common.by import By
# 从selenium导入Keys类（此处未实际使用，保留原导入，可后续扩展）
from selenium.webdriver.common.keys import Keys
# 导入WebDriverWait类（此处未实际使用，保留原导入，可后续扩展显式等待）
from selenium.webdriver.support.wait import WebDriverWait

# 1. 初始化并打开Chrome浏览器
# executable_path：指定ChromeDriver驱动的本地绝对路径（适配selenium3及以下版本）
driver = webdriver.Chrome(executable_path='D:/chrome_driver/chromedriver.exe')
# 注释：selenium4及以上版本推荐写法（无需手动指定驱动路径）
# 需提前安装 webdriver-manager 库（pip install webdriver-manager），自动匹配浏览器版本下载驱动
# driver = webdriver.Chrome() # 创建Chrome浏览器对象，后续通过该对象执行所有操作

# 放大浏览器窗口
# maximize_window()：将窗口调整为屏幕最大尺寸，避免元素因窗口过小被隐藏
driver.maximize_window()

# 2. 访问本地目标页面（注册实例.html）
# 定义本地文件路径：使用r前缀表示原始字符串，避免反斜杠被解析为转义字符
url = r"C:\Users\HP\Desktop\UI自动化测试\注册实例.html"
# get()方法：加载本地HTML文件（Chrome支持直接传入本地绝对路径）
driver.get(url)

# 暂停2秒：等待页面完全加载（本地页面加载快，确保主页面表单元素渲染完成）
sleep(2)

# ---------------------- 填写初始页面（主页面）的注册信息（可选，原代码保留） ----------------------
# 定位主页面用户名输入框（id="user"），输入"admin"
# 修复：替换已弃用的find_element_by_css_selector→使用find_element(By.CSS_SELECTOR, 定位器)
driver.find_element(By.CSS_SELECTOR, "#user").send_keys("admin")

# 定位主页面密码输入框（id="password"），输入"123456"
driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")

# 定位主页面电话号码输入框（id="tel"），输入"13012345678"
driver.find_element(By.CSS_SELECTOR, "#tel").send_keys("13012345678")

# 定位主页面电子邮件输入框（id="email"），输入"123@qq.com"
driver.find_element(By.CSS_SELECTOR, "#email").send_keys("123@qq.com")

# 暂停1秒：观察主页面输入效果，为后续窗口操作做准备
sleep(1)

# ---------------------- 1. 获取当前窗口句柄（初始页面的句柄） ----------------------
# current_window_handle：获取driver当前聚焦的窗口句柄（唯一标识窗口）
# 目的：记录初始窗口的句柄，后续用于筛选新打开的注册A页面句柄
current_handle = driver.current_window_handle
# 打印当前窗口句柄（用于调试，确认初始句柄值）
print("综合实例当前窗口句柄：", current_handle)

# ---------------------- 2. 点击“注册A页面”链接（打开新窗口） ----------------------
# 定位链接：通过partial_link_text（模糊匹配链接文本）定位包含“A网页”的链接
# 修复：替换已弃用的find_element_by_partial_link_text→使用find_element(By.PARTIAL_LINK_TEXT, 文本)
# 作用：点击后会在新的浏览器窗口中打开注册A页面（链接href需指向正确的页面地址）
driver.find_element(By.PARTIAL_LINK_TEXT, "A网页").click()

# 暂停2秒：等待新窗口（注册A页面）完全打开并加载（避免未打开就获取句柄）
sleep(2)

# ---------------------- 3. 获取所有窗口句柄 ----------------------
# window_handles：返回当前浏览器所有已打开窗口的句柄列表（顺序为窗口打开顺序）
# 此时列表包含两个句柄：初始页面句柄 + 注册A页面句柄
handles = driver.window_handles
# 打印所有窗口句柄（用于调试，确认句柄数量和值）
print("所有窗口句柄：", handles)

# ---------------------- 4. 筛选注册A页面句柄并切换 ----------------------
# 遍历所有窗口句柄，筛选出“非初始页面句柄”（即注册A页面的句柄）
# 逻辑：初始页面句柄是current_handle，新打开的窗口句柄必然是列表中其他值
for handle in handles:
    if handle != current_handle:
        # 切换到注册A页面的窗口：switch_to.window(句柄)→将driver聚焦到目标窗口
        driver.switch_to.window(handle)
        # 打印切换后的窗口句柄（用于调试，确认切换成功）
        print("已切换到注册A页面，句柄：", handle)
        # 找到目标句柄后可退出循环（避免重复遍历）
        break

# 暂停1秒：等待窗口切换完成，确保driver已聚焦到注册A页面
sleep(1)

# ---------------------- 5. 操作注册A页面的元素（填写表单） ----------------------
# 此时driver上下文已切换到注册A页面，可直接定位窗口内的元素
# 用户名（id="userA"），输入"adminA"
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("adminA")

# 密码（id="passwordA"），输入"123456"
driver.find_element(By.CSS_SELECTOR, "#passwordA").send_keys("123456")

# 电话号码（id="telA"），输入"15011111111"
driver.find_element(By.CSS_SELECTOR, "#telA").send_keys("15011111111")

# 电子邮件（id="emailA"），输入"123456@qq.com"
driver.find_element(By.CSS_SELECTOR, "#emailA").send_keys("123456@qq.com")

# 暂停3秒：观察注册A页面的输入效果
sleep(3)

# 关闭所有浏览器窗口并释放资源
driver.quit()